#include "ConexionBidireccional.h"

ConexionBidireccional::ConexionBidireccional(std::string host,SocketProtocoloPlano* socket,ColaMensajes* mensajes){
	this->host = host;
	this->socket = socket;
	this->mensajes = mensajes;

	this->sender =  new Sender(socket,mensajes);
	this->recever =  new Recever(socket,mensajes);
}

ConexionBidireccional::ConexionBidireccional(std::string host,SocketProtocoloPlano* socket,unsigned int listenPort,unsigned int broadcastPort,ColaMensajes* colaRecibir,ColaMensajes* colaEnviar){
	this->socket = NULL;
	this->sender =  new Sender(broadcastPort,host,colaEnviar);
	this->recever =  new Recever(listenPort,host,colaRecibir);

	this->sender->start();
	this->recever->start();
}

ConexionBidireccional::ConexionBidireccional(SocketProtocoloPlano* socket,unsigned int listenPort,unsigned int broadcastPort,ColaMensajes* colaRecibir,ColaMensajes* colaEnviar){
	this->socket = NULL;

	this->sender =  new Sender(broadcastPort,colaEnviar);
	this->recever =  new Recever(listenPort,colaRecibir);

	this->sender->start();
	this->recever->start();
}

int ConexionBidireccional::terminar(){


	this->recever->terminarSocket();
	this->sender->terminarSocket();

	if(this->socket != NULL){
		//Cierro el socket
		socket->shutdown();
		return socket->close();
	}

	return SOCKET_EXITO;
}

void ConexionBidireccional::join(){
	this->recever->join();
	this->sender->join();
}

int ConexionBidireccional::enviar(DTO* dto){
	return this->sender->enviar(dto);
}

DTO* ConexionBidireccional::recibir(){
	return this->recever->recibir();
}

bool ConexionBidireccional::estaConectado(){
	return (((Conexion*)recever)->estaConectado() && ((Conexion*)sender)->estaConectado());
}

//No cerrar el socket.
ConexionBidireccional::~ConexionBidireccional(){
}
